package com.campus.food.mapper;

import com.campus.food.model.entity.Review;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 评价Mapper接口
 * 
 * @author Claude3.7 Sonnet
 * @since 2025-05-29
 */
@Mapper
public interface ReviewMapper {
    
    /**
     * 根据ID查询评价
     */
    Review selectById(@Param("id") Long id);
    
    /**
     * 插入评价
     */
    int insert(Review review);
    
    /**
     * 更新评价
     */
    int updateById(Review review);
    
    /**
     * 根据ID删除评价
     */
    int deleteById(@Param("id") Long id);
    
    /**
     * 根据订单ID查询评价
     */
    Review selectByOrderId(@Param("orderId") Long orderId);
    
    /**
     * 分页查询商家评价列表
     */
    List<Review> selectPageByMerchant(@Param("merchantId") Long merchantId,
                                     @Param("offset") Integer offset,
                                     @Param("limit") Integer limit,
                                     @Param("rating") Integer rating);
    
    /**
     * 查询商家评价总数
     */
    Long selectCountByMerchant(@Param("merchantId") Long merchantId,
                              @Param("rating") Integer rating);
    
    /**
     * 分页查询用户评价列表
     */
    List<Review> selectPageByUser(@Param("userId") Long userId,
                                 @Param("offset") Integer offset,
                                 @Param("limit") Integer limit);
    
    /**
     * 查询用户评价总数
     */
    Long selectCountByUser(@Param("userId") Long userId);
    
    /**
     * 查询商家平均评分
     */
    Double selectAvgRatingByMerchant(@Param("merchantId") Long merchantId);
    
    /**
     * 查询商家各评分等级的数量
     */
    List<Review> selectRatingCountByMerchant(@Param("merchantId") Long merchantId);
    
    /**
     * 检查用户是否已评价订单
     */
    boolean existsByOrderId(@Param("orderId") Long orderId);
    
    /**
     * 根据商家ID查询评价列表
     */
    List<Review> selectByMerchantId(@Param("merchantId") Long merchantId,
                                   @Param("offset") int offset,
                                   @Param("size") int size);
    
    /**
     * 根据用户ID查询评价列表
     */
    List<Review> selectByUserId(@Param("userId") Long userId,
                               @Param("offset") int offset,
                               @Param("size") int size);
    
    /**
     * 管理员查询所有评价
     */
    List<Review> selectAllForAdmin(@Param("offset") int offset,
                                  @Param("size") int size,
                                  @Param("userId") Long userId,
                                  @Param("merchantId") Long merchantId);
    
    /**
     * 批量删除评价
     */
    int deleteBatch(@Param("ids") List<Long> ids);
    
    /**
     * 分页查询用户评价列表（带评分筛选）
     */
    List<Review> selectPageByUserAndRating(@Param("userId") Long userId,
                                          @Param("offset") Integer offset,
                                          @Param("limit") Integer limit,
                                          @Param("rating") Integer rating);
    
    /**
     * 查询用户评价总数（带评分筛选）
     */
    Long selectCountByUserAndRating(@Param("userId") Long userId,
                                   @Param("rating") Integer rating);
    
    /**
     * 更新评价回复
     */
    int updateReply(@Param("id") Long id, @Param("reply") String reply);
    
    /**
     * 管理员查询所有评价（带评分筛选）
     */
    List<Review> selectAllForAdminWithRating(@Param("offset") int offset,
                                           @Param("size") int size,
                                           @Param("userId") Long userId,
                                           @Param("merchantId") Long merchantId,
                                           @Param("rating") Integer rating);
    
    /**
     * 管理员查询所有评价总数
     */
    Long selectAllCountForAdmin(@Param("userId") Long userId,
                               @Param("merchantId") Long merchantId,
                               @Param("rating") Integer rating);
    
    /**
     * 根据评分查询评价列表
     */
    List<Review> selectByRating(@Param("rating") Integer rating,
                               @Param("offset") int offset,
                               @Param("size") int size);
    
    /**
     * 搜索评价
     */
    List<Review> searchReviews(@Param("keyword") String keyword,
                              @Param("offset") int offset,
                              @Param("size") int size,
                              @Param("merchantId") Long merchantId,
                              @Param("rating") Integer rating);
    
    /**
     * 获取最新评价列表
     */
    List<Review> selectLatestReviews(@Param("limit") int limit,
                                   @Param("merchantId") Long merchantId);
    
    /**
     * 获取有图评价列表
     */
    List<Review> selectReviewsWithImages(@Param("merchantId") Long merchantId,
                                       @Param("offset") int offset,
                                       @Param("size") int size);
    
    /**
     * 查询商家已回复的评价数量
     */
    Long selectRepliedCountByMerchant(@Param("merchantId") Long merchantId);
} 